#!/bin/bash
source /home/shell/util.sh

if [ ! -f "/usr/bin/docker" ]; then
    bash /home/shell/docker-install.sh
else
    printInfo "`docker -v`"
fi

hostnamectl set-hostname master
echo -e "$host_addr\tmaster" >> /etc/hosts

cp /home/shell/support/docker/kubernetes_aliyun.repo /etc/yum.repos.d/
# yum makecache

# yum list kubelet --showduplicates
# 安装软件
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# 启动kubelet服务
systemctl enable --now kubelet

# 添加防火墙
## k8s端口

# 添加防火墙
## k8s端口
firewall-addport 6443
firewall-addport 10250
## dashboard端口
firewall-addport 30000

kubelet_version=`kubelet --version|awk '{print $2}'`
# 版本
printInfo "============kubelet============"
kubelet --version
printInfo "============kubelet============"
# 显示驱动模式
printInfo "============Cgroup============"
docker info | grep Cgroup
printInfo "============Cgroup============"

# 初始化1
# apiserver-advertise-address：API 服务器所公布的其正在监听的 IP 地址。如果未设置，则使用默认网络接口
# apiserver-cert-extra-sans：用于 API Server 服务证书的可选附加主题备用名称（SAN）。可以是 IP 地址和 DNS 名称
# image-repository：选择用于拉取控制平面镜像的容器仓库,默认值："k8s.gcr.io"
# ignore-preflight-errors：错误将显示为警告的检查列表；例如：'IsPrivilegedUser,Swap'。取值为 'all' 时将忽略检查中的所有错误
# kubernetes-version：为控制平面选择一个特定的 Kubernetes 版本，默认值："stable-1"
# service-cidr：为服务的虚拟 IP 地址另外指定 IP 地址段，默认值："10.96.0.0/12"
# pod-network-cidr：指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数，控制平面将会为每一个节点自动分配 CIDRs

coredns_version=1.8.4

docker pull docker.io/coredns/coredns:${coredns_version}
docker tag coredns/coredns:${coredns_version} registry.aliyuncs.com/google_containers/coredns:v${coredns_version}
docker rmi -f coredns/coredns:${coredns_version}

kubeadm init \
--apiserver-advertise-address=0.0.0.0 \
--apiserver-cert-extra-sans=127.0.0.1 \
--image-repository=registry.aliyuncs.com/google_containers \
--ignore-preflight-errors=all \
--kubernetes-version=$kubelet_version \
--service-cidr=10.10.0.0/16 \
--pod-network-cidr=10.18.0.0/16

# 
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 新建管理员
# echo "admin,admin,1" > /etc/kubernetes/pki/basic_auth_file
# kubectl create clusterrolebinding my-cluster-admin --clusterrole=cluster-admin --user=admin
# kubectl taint nodes --all node-role.kubernetes.io/master-

# 安装calico网络
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
while [ `kubectl get node|grep -v "NAME"|awk {'print $2'}` != "Ready" ]; do
    loadMsg "Node准备中，请稍后..."
    sleep 1s
done

printInfo "============node============"
# kubectl describe node master
kubectl get node
printInfo "============node============"
printInfo "============pod============"
kubectl get pod --all-namespaces
printInfo "============pod============"

kubectl create -f /home/shell/support/docker/recommended.yaml
# 创建登录Token
kubectl create sa dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl taint nodes --all node-role.kubernetes.io/master-

ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}')
DASHBOARD_LOGIN_TOKEN=$(kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}')

printInfo "============kubernetes-dashboard============"
kubectl get svc -n kubernetes-dashboard
printInfo "dashboard地址: https://$host_addr:30000/"
printInfo "dashboard Token: ${DASHBOARD_LOGIN_TOKEN}"
printInfo "============kubernetes-dashboard============"